﻿Imports System.ComponentModel
Imports System.Windows.Forms
Imports FairShop.Helpers

Public Class InvoerArtikelsControl

#Region "Properties"

    Private _laatNegatiefAantalToe As Boolean = True
    Private _laatDozenToe As Boolean = True

    <Category("FairShop")> _
    Public Property Barcode() As String
        Get
            Dim trimmedText As String = tbBarcode.Text.Trim(" "c)
            If (trimmedText.Contains("*")) Then
                ' geef het deel na het vermenigvuldigingsteken
                Return trimmedText.Split("*"c)(1)
            Else
                Return trimmedText
            End If
        End Get
        Set(ByVal value As String)
            tbBarcode.Text = value
            If (value <> "") Then
                tbBarcode.BackColor = Constants.Kleuren.GELDIG
            End If
        End Set
    End Property

    <Category("FairShop"), DefaultValue(0)> _
    Public ReadOnly Property Aantal() As Integer
        Get
            If (Not BarcodeHelper.CheckValidBarcode(tbBarcode.Text, LaatNegatiefAantalToe)) Then Return 0
            Dim trimmedText As String = tbBarcode.Text.Trim(" "c)
            If (trimmedText.Contains("*")) Then
                ' geef het deel voor het vermenigvuldigingsteken
                Dim tempAantal As Integer
                If (Integer.TryParse(trimmedText.Split("*"c)(0), tempAantal)) Then
                    Return tempAantal
                End If
                Return 0
            Else
                Return 1
            End If
        End Get
    End Property

    <Category("FairShop"), DefaultValue(True)> _
    Public Property LaatNegatiefAantalToe() As Boolean
        Get
            Return _laatNegatiefAantalToe
        End Get
        Set(ByVal value As Boolean)
            _laatNegatiefAantalToe = value
        End Set
    End Property

    <Category("FairShop"), DefaultValue(True)> _
    Public Property LaatDozenToe() As Boolean
        Get
            Return _laatDozenToe
        End Get
        Set(ByVal value As Boolean)
            _laatDozenToe = value
        End Set
    End Property

    Private WriteOnly Property VensterActief() As Boolean
        Set(ByVal value As Boolean)
            If (value) Then
                If (tbBarcode.Focused) Then
                    tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
                Else
                    tbBarcode.BackColor = Constants.Kleuren.GEEN_FOCUS
                End If
            Else
                tbBarcode.BackColor = Constants.Kleuren.GEEN_FOCUS
            End If
        End Set
    End Property

#End Region

#Region "Eigen events"

    Public Event BarcodeConfirmed(ByVal sender As Object, ByVal e As BarcodeConfirmedEventArgs)

#End Region

#Region "Handled events"

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        tbBarcode.Focus()
    End Sub

    Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
        If (tbBarcode.Focused) Then
            Select Case keyData
                Case Keys.Tab
                    ' nodig om de Tab-toets zelf te verwerken in het geval van het barcode-tekstvak
                    Return False
                Case Keys.F10
                    ' werkt niet via KeyPress (misschien via KeyUp?)
                    ZoekArtikelEnBevestig()
                    Return False
            End Select
        End If
        Return MyBase.ProcessDialogKey(keyData)
    End Function

    Private Sub tbBarcode_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) _
                Handles tbBarcode.KeyPress
        Select Case e.KeyChar
            Case Convert.ToChar(Keys.Return), Convert.ToChar(Keys.Tab)
                BarcodeBevestigd()
                e.Handled = True
            Case " "c
                ' Clear
                tbBarcode.Text = ""
                e.Handled = True
        End Select
        If (tbBarcode.Text = "") Then
            tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
        End If
    End Sub

    Private Sub tbBarcode_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles tbBarcode.Enter
        If (tbBarcode.Text = "") Then
            tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
        End If
    End Sub

    Private Sub tbBarcode_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles tbBarcode.Leave
        If (tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN) Then
            tbBarcode.BackColor = Constants.Kleuren.GEEN_FOCUS
        End If
    End Sub

    Private Sub tbBarcode_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles tbBarcode.TextChanged
        tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
    End Sub

    'Private Sub tbBarcode_Validating(ByVal sender As System.Object, ByVal e As CancelEventArgs) _
    '        Handles tbBarcode.Validating
    '    If (tbBarcode.Text <> "") Then
    '    End If
    'End Sub

    Private Sub btnZoeken_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnZoeken.Click
        ZoekArtikelEnBevestig()
    End Sub

    ''' <summary>
    ''' Moet vanuit het venster waarin de control staat gekoppeld worden aan OnDeactivate
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Public Sub VensterDeactivate(ByVal sender As Object, ByVal e As EventArgs)
        VensterActief = False
    End Sub

    ''' <summary>
    ''' Moet vanuit het venster waarin de control staat gekoppeld worden aan OnActivated
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Public Sub VensterActivated(ByVal sender As Object, ByVal e As EventArgs)
        VensterActief = True
    End Sub

#End Region

#Region "Public methods"

    ''' <summary>
    ''' Te gebruiken door formulier om de barcode te initialiseren zodat de gebruiker direct kan beginnen invoeren
    ''' </summary>
    Public Sub Clear()
        Barcode = ""
        'Aantal = 0
        '_aantalIsVerwerkt = False
        Me.tbBarcode.Focus()
        tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
    End Sub

    ''' <summary>
    ''' Geef door aan het formulier dat de invoer mag geannuleerd worden
    ''' </summary>
    Public Sub AnnuleerInvoer()
        Barcode = ""
        'RaiseEvent InvoerGeannuleerd(Me, EventArgs.Empty)
    End Sub

    Public Sub BarcodeBevestigd()
        ' barcodelezer genereert dit ook na inlezen volledige barcode
        If (Me.Barcode = "") Then
            tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
        Else
            If Utility.CheckValidZoekterm(Me.Barcode) Then
                ' als de gebruiker alleen letters ingeeft => zoeken
                If (Not ZoekArtikel(Me.Barcode)) Then
                    Me.Barcode = ""
                    tbBarcode.BackColor = Constants.Kleuren.KLAAR_VOOR_SCAN
                    Return
                Else
                    ' artikel gevonden, nu is er dus een barcode ingevuld, gewoon doorgaan met procedure hieronder voor barcodes
                End If
            End If
            tbBarcode.Text = BarcodeHelper.FixBarcode(tbBarcode.Text)
            If (Not BarcodeHelper.CheckValidBarcode(tbBarcode.Text, LaatNegatiefAantalToe)) Then
                Dim msg As String = String.Format("De invoer mag alleen de volgende vormen hebben: {0}" & _
                        "- een barcode van 8 tot 14 cijfers{0}" & _
                        "- een aantal * een barcode{0}" & _
                        "- een woord met alleen letters om te zoeken naar een artikel{0}{0}." & _
                        "Wil je deze invoer annuleren?", Environment.NewLine)
                If (LaatNegatiefAantalToe) Then
                    msg = String.Format("De invoer mag alleen de volgende vormen hebben: {0}" & _
                            "- een barcode van 8 tot 14 cijfers{0}" & _
                            "- een aantal * een barcode{0}" & _
                            "- een negatief aantal * een barcode{0}" & _
                            "- een woord met alleen letters om te zoeken naar een artikel{0}{0}." & _
                            "Wil je deze invoer annuleren?", Environment.NewLine)
                End If
                If (MessageBox.Show(msg, "Ongeldige invoer", _
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes) Then
                    Barcode = ""
                End If
                tbBarcode.Focus()
                Return
            End If
            Dim ea As New BarcodeConfirmedEventArgs()
            RaiseEvent BarcodeConfirmed(Me, ea)
            Select Case ea.BarcodeStatus
                Case BarcodeStatusType.Valid
                    ' reeds verwerkt
                    Me.Clear()
                Case BarcodeStatusType.Invalid
                    tbBarcode.BackColor = Constants.Kleuren.GEEN_FOCUS
                Case BarcodeStatusType.Speciaal
                    ' bijvoorbeeld bij inventaris als het artikel al in de inventarislijst staat
                    Me.Clear() ' in feite zoals bij Valid
                Case BarcodeStatusType.Cancelled
                    Me.Clear()
                Case BarcodeStatusType.KeepContent
                    tbBarcode.BackColor = Constants.Kleuren.GELDIG
                    ' verder niets doen
            End Select
        End If
    End Sub

#End Region

#Region "Private methods"

    Private Sub ZoekArtikelEnBevestig()
        Dim omschrijving As String = ""
        If Utility.CheckValidZoekterm(Me.Barcode) Then
            omschrijving = Me.Barcode
        End If
        If (ZoekArtikel(omschrijving)) Then
            BarcodeBevestigd()
        End If
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="omschrijving"></param>
    ''' <returns>True als er een artikel gevonden is</returns>
    Private Function ZoekArtikel(ByVal omschrijving As String) As Boolean
        Me.Parent.Cursor = Cursors.WaitCursor
        Dim f As New ZoekArtikelForm(omschrijving, LaatDozenToe)
        If (f.ShowDialog() = DialogResult.OK AndAlso f.Artikel IsNot Nothing) Then
            Dim trimmedText As String = tbBarcode.Text.Trim(" "c)
            Dim reedsIngevoerdAantal As Integer = 1
            If (trimmedText.Contains("*")) Then
                If (Not Integer.TryParse(trimmedText.Split("*"c)(0), reedsIngevoerdAantal)) Then
                    reedsIngevoerdAantal = 1
                End If
            End If
            If (reedsIngevoerdAantal = 1) Then
                tbBarcode.Text = f.Artikel.Barcode
            Else
                tbBarcode.Text = String.Format("{0}*{1}", reedsIngevoerdAantal, f.Artikel.Barcode)
            End If
            Me.Parent.Cursor = Cursors.Default
            Return True
        End If
        Me.Parent.Cursor = Cursors.Default
        Return False
    End Function

#End Region

    ''' <summary>
    ''' Status van de barcode.
    ''' Wordt mede bepaald door het venster waarin de control staat. 
    ''' Dit venster zal de geldigheid van de barcode checken (bv. is het een bestaand artikel).
    ''' </summary>
    Public Enum BarcodeStatusType
        Valid
        Invalid
        'AantalReedsVerwerkt
        Speciaal
        Cancelled
        KeepContent ' gebruikt in DozenToevoegForm
    End Enum

    Public Class BarcodeConfirmedEventArgs
        Inherits EventArgs

        Private _barcodeStatus As BarcodeStatusType = BarcodeStatusType.Invalid
        Public Property BarcodeStatus() As BarcodeStatusType
            Get
                Return _barcodeStatus
            End Get
            Set(ByVal value As BarcodeStatusType)
                _barcodeStatus = value
            End Set
        End Property

    End Class

End Class
